#ifndef MEDIAPLAYERLIST_H
#define MEDIAPLAYERLIST_H

#include <QObject>
#include <QVariant>
class MediaPlayerList : public QObject
{
    Q_OBJECT
public:
    enum PLAYBACK_MODE {
        CurrentItemOnce = 0,//当前歌曲播放一次后停止。
        CurrentItemInLoop,//当前歌曲循环播放。
        Sequential,//顺序播放列表中的歌曲。
        Loop,//循环播放整个列表。
        Random,//随机播放列表中的歌曲
        PM_Unknown = 5//未知模式（默认值）
    };
    explicit MediaPlayerList(QObject *parent = nullptr);

    //设置整个歌曲列表，并清空历史记录和当前索引
    void setSongList(const QVariantList &songList);

    //返回当前歌曲列表
    QVariantList songList() const { return m_list; }
    
    //添加歌曲
    int appendSong(const QVariantMap &song);//在列表末尾添加一首歌曲，返回新歌曲的索引
    void insertSong(int index, const QVariantMap &song);//在指定索引处出入一首歌曲
    
    //删除歌曲
    bool removeSong(int index);//删除指定索引的歌曲，返回是否成功
    void removeSongList(const QVariantList &list);//删除列表中的多首歌曲
    void clear();//清空整个播放列表
    
    //检查列表是否为空
    bool isEmpty() const;

    PLAYBACK_MODE playbackMode() const { return m_mode; }
    void setPlaybackMode(PLAYBACK_MODE mode);//设置播放模式，并发处playbackModeChanged信号
    void nextPlaybackMode();//切换到下一个播放模式，循环切换

    void setCurrentIndex(int index);//设置当前播放歌曲的索引
    QString songAt(int index);//获取指定索引处的歌曲路径
    QString currentSong();//获取当前播放歌曲路径
    QString previousSong();//获取上一首歌曲路径，根据播放模式和播放历史决定返回结果
    QString nextSong();//获取上一首播放的歌曲路径，根据播放模式决定返回结果

signals:
    void currentIndexChanged();
    void playbackModeChanged(int);

private:
    bool isAvailableIndex(int index) const;

private:
    PLAYBACK_MODE m_mode = Sequential;
    QVariantList m_list;
    int m_index = -1;
    QList<int> m_history;
};

#endif // MEDIAPLAYERLIST_H
